//
//  YHPerson.m
//  LyhToolsTest
//
//  Created by LYH on 2019/1/2.
//  Copyright © 2019年 LYH.com. All rights reserved.
//

#import "YHPerson.h"
#import <objc/message.h>
@implementation YHPerson

- (void)drink
{
    NSLog(@"哦不喝");
}
/**
 *当调用了没有实现的对象方法的时，就会调用+(BOOL)resolveInstanceMethod:(SEL)sel方法。
 当调用了没有实现的类方法的时候，就会调用+(BOOL)resolveClassMethod:(SEL)sel方法。
 */
/**
第一个参数： cls:给哪个类添加方法
第二个参数： SEL name:添加方法的编号
第三个参数： IMP imp: 方法的实现，函数入口，函数名可与方法名不同（建议与方法名相同）
第四个参数： types :方法类型（函数的返回值类型，参数类型），需要用特定符号，参考API
v -> void 表示无返回值
@ -> object 表示id参数
: -> method selector 表示SEL
*/
+(BOOL)resolveInstanceMethod:(SEL)sel
{
    // 动态添加eat方法，有参数的话加：
    // 首先判断sel是不是eat方法 也可以转化成字符串进行比较。
    if (sel == @selector(eat)) {
        class_addMethod(self, @selector(eat), (IMP)eat, "v@:");
         return YES;
//        class_addMethod(<#Class  _Nullable __unsafe_unretained cls#>, <#SEL  _Nonnull name#>, <#IMP  _Nonnull imp#>, <#const char * _Nullable types#>)
    }
    
     return [super resolveInstanceMethod:sel];
}
// 默认方法都有两个隐式参数，
void eat(id self,SEL _cmd)
{
    NSLog(@"%@ %@ 方法动态添加成功了",self,NSStringFromSelector(_cmd));
    NSLog(@"我吃了");
}
@end
